#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>

pthread_mutex_t mutex1,mutex2;

unsigned int letters=0,digitals=0;
//自定义线程函数
void* ThreadFun(void* arg){
	printf("s=%s",arg);
	char *s=(char*)arg;
	while(*s!='\0'){
		if((*s>='a'&&*s<='z')||(*s>='A'&&*s<='Z')){
            //letters为临界资源，互斥访问
			pthread_mutex_lock(&mutex1);
			letters++;
			pthread_mutex_unlock(&mutex1);
		}
		else if(*s>='0'&&*s<='9'){
            //同理
			pthread_mutex_lock(&mutex2);
			digitals++;
			pthread_mutex_unlock(&mutex2);
		}
		s++;//指针移动
	}
	return NULL;
}

int main(){
	pthread_t tid1,tid2;//声明线程
	FILE *fp;//文件指针
	char *s1,*s2;//缓冲区
	unsigned int len;
	fp=fopen("D:\\Microsoft VS Code\\mycode\\mycode\\data.txt","r");//打开文件
	fseek(fp,0,SEEK_END);//设置文件指针的起始位置在文件末
	len=ftell(fp);//计算当前文件指针和文件首的距离的相对字节个数
	printf("The length of file: %d\n", len);
    //为缓冲区申请空间
	s1=(char *)malloc(sizeof(char)*(len/2+2));
	s2=(char *)malloc(sizeof(char)*(len/2+2));
	rewind(fp);//设置文件指针回到文件首部
    //读取文件到缓冲区
	fgets(s1,len/2+1,fp);
	fgets(s2,len/2+1,fp);
	fclose(fp);//关闭文件
    //创建线程
	pthread_create(&tid1,NULL,ThreadFun,s1);
	pthread_create(&tid2,NULL,ThreadFun,s2);
    //主线程必须等待一下两个子线程结束才能运行接下来的程序
	pthread_join(tid1,NULL);
	pthread_join(tid2,NULL);
    //到此子线程全部结束
	pthread_mutex_destroy(&mutex1);
	pthread_mutex_destroy(&mutex2);

	printf("couter:digits=%d,letters=%d\n",digitals,letters);
	//释放缓冲区
    free(s1);
	free(s2);
	return 0;
}